// PerformanceLogger.cpp
// 性能日志系统实现
// 使用LogConfig统一管理配置

#include "PerformanceLogger.hh"
#include "LogConfig.hh"
#include <sys/time.h>
#include <string.h>

// 获取单例实例
PerformanceLogger& PerformanceLogger::getInstance() {
    static PerformanceLogger instance;
    return instance;
}

// 构造函数
PerformanceLogger::PerformanceLogger() 
    : fLogFile(nullptr), fInitialized(false), fLogCount(0) {
    pthread_mutex_init(&fMutex, nullptr);
}

// 析构函数
PerformanceLogger::~PerformanceLogger() {
    shutdown();
    pthread_mutex_destroy(&fMutex);
}

// 初始化日志系统
void PerformanceLogger::init() {
    pthread_mutex_lock(&fMutex);
    if (!fInitialized) {
        initInternal();
    }
    pthread_mutex_unlock(&fMutex);
}

// 内部初始化函数
void PerformanceLogger::initInternal() {
    if (fLogFile == nullptr) {
        // 从LogConfig获取性能日志文件路径
        LogConfig& config = LogConfig::getInstance();
        std::string perfLogFile = config.getPerformanceLogFile();
        
        fLogFile = fopen(perfLogFile.c_str(), "a");
        if (fLogFile) {
            setvbuf(fLogFile, nullptr, _IOFBF, 8192);  // 设置8KB缓冲区，减少I/O次数
            fInitialized = true;
        }
    }
}

// 记录日志（带时间戳）
void PerformanceLogger::log(const char* fmt, ...) {
    // 检查日志总开关和性能日志模块开关
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::PERFORMANCE)) {
        return;
    }
    
    pthread_mutex_lock(&fMutex);
    
    // 延迟初始化
    if (!fInitialized) {
        initInternal();
    }
    
    if (fLogFile) {
        // 添加时间戳（简化版本，减少开销）
        struct timeval tv;
        gettimeofday(&tv, nullptr);
        fprintf(fLogFile, "[%ld.%06ld] ", tv.tv_sec, tv.tv_usec);
        
        va_list ap;
        va_start(ap, fmt);
        vfprintf(fLogFile, fmt, ap);
        va_end(ap);
        fprintf(fLogFile, "\n");
        
        // 每100条日志刷新一次，减少I/O开销
        if (++fLogCount % 100 == 0) {
            fflush(fLogFile);
        }
    }
    
    pthread_mutex_unlock(&fMutex);
}

// 记录关键错误日志（简化版本，减少日志频率）
void PerformanceLogger::logError(const char* fmt, ...) {
    // 检查日志总开关和性能日志模块开关
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::PERFORMANCE)) {
        return;
    }
    
    pthread_mutex_lock(&fMutex);
    
    // 延迟初始化
    if (!fInitialized) {
        initInternal();
    }
    
    if (fLogFile) {
        // 添加时间戳
        struct timeval tv;
        gettimeofday(&tv, nullptr);
        fprintf(fLogFile, "[%ld.%06ld] ", tv.tv_sec, tv.tv_usec);
        
        va_list ap;
        va_start(ap, fmt);
        vfprintf(fLogFile, fmt, ap);
        va_end(ap);
        fprintf(fLogFile, "\n");
        
        // 错误日志立即刷新，确保重要信息不丢失
        fflush(fLogFile);
        fLogCount++;
    }
    
    pthread_mutex_unlock(&fMutex);
}

// 关闭日志系统
void PerformanceLogger::shutdown() {
    pthread_mutex_lock(&fMutex);
    if (fLogFile != nullptr) {
        fflush(fLogFile);
        fclose(fLogFile);
        fLogFile = nullptr;
    }
    fInitialized = false;
    pthread_mutex_unlock(&fMutex);
}

